Приведение ссылочных типов
- Возможность вызвать метод определяется по типу ссылки
- Ссылку нельзя привести к произвольному типу
- Сслыку можно привести к более общему типу
- Ссылку можно привести к реальному типу объекта
- Оператор
instanceofпроверяет тип объекта
Оператор instanceof
// ColorSquare extends Square
ColorSquare s = new ColorSquare();
s instanceof ColorSquare // true
s instanceof Square // true
s instanceof String // false
Upcasting
Приведение к суперклассу
Square x = s;
x.area(); // OK
x.getColor(); // Ошибка - нет такого метода
Downcasting
Приведение к реальному типу
Если изначально был таким
ColorSquare s = new ColorSquare();
Square x = s;
x.area(); // OK
ColorSquare y = (ColorSquare) x;
y.getColor(); // OK
А вот если нет
Square s = new ColorSquare();
Square x = s;
x.area(); // OK
ColorSquare y = (ColorSquare) x;
// ClassCastException
Pattern Matching
Перед даункастом лучше проверить тип через instanceof
...
if (x instanceof ColorSquare) {
ColorSquare y = (ColorSquare) x;
y.getColor(); // OK
}
Либо более короткий синтаксис
...
if (x instanceof Colorsquare y) {
y.getColor(); // OK
}
То есть после апкаста джава не забывает какой тип был изначально